#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <arm_neon.h>
#include <time.h>

#define NUM_THREADS 4 // 设置线程数
#define n 4           // 假设n为4，实际情况根据需要调整

float A[n][n]; // 假设A为n x n的矩阵

void initialize_matrix(float A[n][n]) {
    // 随机初始化矩阵A，这里简化为示例，实际应根据需求进行初始化
    srand(time(NULL));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            A[i][j] = rand() / (float)RAND_MAX; // 随机生成0~1之间的浮点数
}

void f_omp_static_neon_dynamicThreads() {
    float32x4_t va = vmovq_n_f32(0);
    float32x4_t vx = vmovq_n_f32(0);
    float32x4_t vaij = vmovq_n_f32(0);
    float32x4_t vaik = vmovq_n_f32(0);
    float32x4_t vakj = vmovq_n_f32(0);
    double start_time = omp_get_wtime(); // 记录开始时间
    #pragma omp parallel num_threads(NUM_THREADS) private(va, vx, vaij, vaik, vakj)
    {
        #pragma omp for schedule(dynamic) // 使用动态线程调度
        for (int k = 0; k < n; k++) {
            // 串行部分
            float32x4_t vt = vmovq_n_f32(A[k][k]);
            for (int j = k + 1; j < n; j++) {
                va = vld1q_f32(&(A[k][j]));
                va = vdivq_f32(va, vt);
                vst1q_f32(&(A[k][j]), va);
            }
        }
    }
    double end_time = omp_get_wtime(); // 记录结束时间
    printf("Program execution time: %f seconds\n", end_time - start_time); // 输出程序运行时间
}

int main() {
    initialize_matrix(A); // 初始化A

    f_omp_static_neon_dynamicThreads(); // 调用动态线程版OpenMP高斯消去函数

    return 0;
}
